package jmysql;


import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import validaciones.ValidateJSON;
 
public class CUsuario {
	
	//conector
	Cmysql cmysql;
	public CUsuario(){
		cmysql=new Cmysql();//construimos el objeto que permite la conexi�n
	}
	
	/*Busca un nombre de usuario para comprobar si todav�a esta disponible*/
	public boolean Existe(String nomusuario){
		boolean salida=false;
		try {
            Connection conexion = (Connection) cmysql.dataSource.getConnection();
            PreparedStatement st=(PreparedStatement) conexion.prepareStatement("select nombre from usuario where nomusuario=?");
            st.setString(1, nomusuario);
            ResultSet rs = st.executeQuery();
            
            if(rs.next())//encontramos el elemento
                salida=true;
				
            rs.close();
            st.close();
            conexion.close();
        }
        catch(SQLException e){
        	System.out.println(""+e.toString());
        }		
		return salida;
	}
	
        /*Retorna el nombre de usuario*/
        public String NombreUsuario(int idusuario){
            String salida="";
            try {
            Connection conexion = (Connection) cmysql.dataSource.getConnection();
            PreparedStatement st=(PreparedStatement) conexion.prepareStatement("select nombre from usuario where idusuario=?");
            st.setInt(1, idusuario);
            ResultSet rs = st.executeQuery();
            
            if(rs.next())//encontramos el elemento
                salida=rs.getObject(1).toString();
				
            rs.close();
            st.close();
            conexion.close();
            }
            catch(SQLException e){
        	System.out.println(""+e.toString());
            }		
            return salida;
        }
        
        
	/*	Agrega al usuario
	 * 	
	 * */
	public boolean AgregarUsuario(ValidateJSON data){
		boolean salida=false;
		try {
            Connection conexion = (Connection) cmysql.dataSource.getConnection();
            PreparedStatement st=(PreparedStatement) conexion.prepareStatement("" +
            		"INSERT INTO usuario "+
            		"(nomusuario,nombre,nopersonal,telefono,correo,estado,password,fecha_creacion)"+
            		"VALUES "+
            		" (?,?,?,?,?,1,?,CURDATE())",Statement.RETURN_GENERATED_KEYS);
            //ingresamos los par�metros
			st.setString(1, data.getString("nomusuario"));
			st.setString(2, data.getString("nombre"));
			st.setInt(3, Integer.parseInt(data.getString("nopersonal")));
			st.setString(4, data.getString("telefono"));
			st.setString(5,data.getString("correo"));
			st.setString(6,data.getString("password"));
			
            st.execute();//se ejecuta sin problemas
            salida=true;
            /*Tenemos el id de usuario*/
            ResultSet rs = st.getGeneratedKeys();
            int idusuario=-1;
            if (rs != null && rs.next()) 
                idusuario= rs.getInt(1);
            
            /*Tenemos la llave es necesario asignar un �rea  si esta es de acuerdo al rol*/
            if(idusuario!=-1){
            	st=(PreparedStatement) conexion.prepareStatement("" +
            		"INSERT INTO asignacion (idusuario,idrol,idarea)"+
            		"VALUES "+
            		" (?,?,?)");
            	
            	st.setInt(1,idusuario);
            	st.setInt(2,data.gInt("rol"));
            	st.setInt(3,data.gInt("area"));
            	
            	st.execute();//se ejecuta sin problemas
            	salida=true;
            }else
            	salida=false;
            
            st.close();
            conexion.close();
        }
        catch(SQLException e){
        	System.out.println(""+e.toString());
        }
		return salida;
	}
	
	
	
	
	
	public JSONObject GetListaUsuario(){
		JSONArray Items=new JSONArray();
		JSONArray item=new JSONArray();
		JSONObject j=new JSONObject();

		String edit="<img style=\"width:15px;height:17px;\" src=\"images/sistema/edit.png\"/>";
		//String permiso="<img style=\"width:15px;height:17px;\" src=\"images/sistema/lock_n.png\"/>";
		try {
            Connection conexion = (Connection) cmysql.dataSource.getConnection();
            PreparedStatement st=(PreparedStatement) conexion.prepareStatement("" +
            		"select idusuario,nomusuario,nombre,estado from usuario where idusuario<>1");
            ResultSet rs = st.executeQuery();
            while(rs.next()){
            	item=new JSONArray();
            	item.put("<button title=\"Modifica los datos personales\" style=\"width:45px;\">"+edit+"</button>"); 
            	//item.put("<button title=\"Modifica los permisos de acceso\" style=\"width:45px;\">"+permiso+"</button>");
            	item.put(rs.getObject(1).toString());//idusuario
            	item.put(rs.getObject(2).toString());//nomusuario
            	item.put(rs.getObject(3).toString());//nombre
            	if(rs.getInt(4)==1)
            		item.put("Activo");
            	else
            		item.put("Inactivo");
            	
            	//Junta todos los elementos en un jsonarray
            	Items.put(item);
            }
            rs.close();
            st.close();
            conexion.close(); 
        }
        catch(SQLException e){
        	System.out.println(""+e.toString());
        }
		try {
			j.put("aDataSet", Items);
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return j;
	}
	
	/*
	 * Obtiene un usuario en especif�co
	 * 
	 * */
	public JSONObject GetUsuarioConEstado(int idusuario){
		JSONObject resultado=new JSONObject();
		try {
            Connection conexion = (Connection) cmysql.dataSource.getConnection();
            PreparedStatement st=(PreparedStatement) conexion.prepareStatement("" +
            		"select nombre,nomusuario,nopersonal,correo,telefono,estado,password from usuario where idusuario=?");
            
            /*El id de usuario que utilizaremos*/
            st.setInt(1,idusuario);
            
            ResultSet rs = st.executeQuery();
            while(rs!=null&&rs.next()){
            	resultado.put("nombre",rs.getObject(1).toString());//nombre
            	resultado.put("nomusuario",rs.getObject(2).toString());//nomusuario
            	resultado.put("nopersonal",rs.getInt(3));//nopersonal
            	resultado.put("correo",rs.getObject(4).toString());//m_correo
            	resultado.put("telefono",rs.getObject(5).toString());//m_telefono
            	resultado.put("estado",rs.getInt(6));//m_estado
            	resultado.put("password", rs.getObject(7).toString());
            } 
            rs.close();
            st.close();
            conexion.close(); 
        }
        catch(SQLException e){
        	System.out.println(""+e.toString());
        } catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return resultado;
	}
	
	
	/*Actualiza los datos del usuario para luego ser accedidos*/
	public boolean UpdateUsuario(int idusuario,String query){
		boolean salida=false;
		try {
            Connection conexion = (Connection) cmysql.dataSource.getConnection();
            PreparedStatement st=(PreparedStatement) conexion.prepareStatement(
            		"update usuario set "+query+" where idusuario="+idusuario
            		);            
            st.execute();
            salida=true;
            st.close();
            conexion.close();
        }
        catch(SQLException e){
        	System.out.println(""+e.toString());
        }
		return salida;
	}
	
	/*Obtiene el �rea y rol de un usuario que son los permisos*/
	public String permisos(int idusuario){
		String query="select asig.idarea,ar.nomarea,asig.idrol,r.nombre from asignacion asig,area ar, rol r" +
				" where asig.idusuario=?" +
				" and ar.idarea=asig.idarea" +
				" and r.idrol=asig.idrol";
		
		String resultado="";
		String class_="class=\"ui-widget-content ui-corner-all\"";
		String class_esconder="class=\"ui-widget-content ui-corner-all esconder\"";//para esconder valores de columnas
		try {
            Connection conexion = (Connection) cmysql.dataSource.getConnection();
            PreparedStatement st=(PreparedStatement) conexion.prepareStatement(query);   
            st.setInt(1,idusuario);
            ResultSet rs=st.executeQuery();
            
            while(rs!=null&&rs.next()){
            	resultado+="<tr >"+
            			"<td "+class_+"><img style=\"width:15px;height:15px;\" src=\"images/sistema/delete.png\"/></td>"+
            			"<td "+class_esconder+">"+rs.getObject(1).toString()+"</td>"+
            			"<td "+class_+">"+rs.getObject(2).toString()+"</td>"+
            			"<td "+class_esconder+">"+rs.getObject(3).toString()+"</td>"+
            			"<td "+class_+">"+rs.getObject(4).toString()+"</td>"+ 
            			"</tr>"
            			;
            } 
            
            st.close();
            conexion.close();
        }
        catch(SQLException e){
        	System.out.println(""+e.toString());
        }
		return resultado;
	}
	
	
	/*Modificar los permisos*/
	
	public boolean ModificarPermisos(int idusuario,String nuevos_permisos){
		boolean salida=false;
		
		String agregar_permiso="insert into asignacion (idusuario,idarea,idrol) values ('"+idusuario+"',?,?)";
		String borrar_permisos="delete from asignacion where idusuario="+idusuario;

		System.out.println(""+nuevos_permisos);
		try {
            Connection conexion = (Connection) cmysql.dataSource.getConnection();
            
            //primero borramos
            PreparedStatement st=(PreparedStatement) conexion.prepareStatement(borrar_permisos);            
            st.execute();
            
            
            if(nuevos_permisos.length()>0){
	            //ahora agregamos todos
	            String permiso[]=nuevos_permisos.split(";");
	            for(int i=0;i<permiso.length;i++){
	            	String c[]=permiso[i].split(",");
	            	if(c.length>0){
	            		System.out.println(c[0]+":"+c[1]);
		            	st=(PreparedStatement) conexion.prepareStatement(agregar_permiso);
		            	st.setInt(1,Integer.parseInt(c[0]));
		            	st.setInt(2,Integer.parseInt(c[1]));
		            	st.execute();//se ejecuta sin problemas
	            	}
	            }
            }
            st.close();
            conexion.close();
        }
        catch(SQLException e){
        	System.out.println(""+e.toString());
        }
		return salida;
	}

	/*Retorna el idusuario si el nombre de usuario y password son correctos*/
	public int idusuario(String nomusuario,String password){
		int  salida=0;//nadie
                
		String query=" select u.idusuario from usuario u where " +
				"  u.nomusuario=? " +
				" and BINARY password=?" 
				;
		try {
                        Connection conexion = (Connection) cmysql.dataSource.getConnection();
                        PreparedStatement st=(PreparedStatement) conexion.prepareStatement(query);
                        
                        st.setString(1, nomusuario);
                        st.setString(2, password);
                        
                        ResultSet rs = st.executeQuery();
                        while(rs.next())//encontramos el elemento
                            salida=rs.getInt(1);
                        rs.close();
                        st.close();
                        conexion.close();
                    }
                    catch(SQLException e){
                        System.out.println(""+e.toString());
                    }		
                
		return salida;
	}
	
        
        /*Devulve true si un usuario especeficio esta asignado en un area y cierto rol*/
        public boolean UsuarioAsignacion(int idusuario,int idarea, int idrol){
            boolean salida=false;
            String query="select idusuario, idarea, idrol from asignacion where "
                    + "idusuario=? "
                    + "and idarea=? "
                    + "and idrol=?";
            try {
                        Connection conexion = (Connection) cmysql.dataSource.getConnection();
                        PreparedStatement st=(PreparedStatement) conexion.prepareStatement(query);
                        st.setInt(1, idusuario);
                        st.setInt(2, idarea);
                        st.setInt(3, idrol);
                        ResultSet rs = st.executeQuery();

                        if(rs.next())//encontramos el elemento
                            salida=true;
                        
                        rs.close();
                        st.close();
                        conexion.close();
                    }
             catch(SQLException e){
                 System.out.println(""+e.toString());
             }	
            
            return salida;
        }
	
}
